import re
from langchain import chains
from langchain.prompts import PromptTemplate
from langchain_community.chat_models import ChatTongyi
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any
from dotenv import load_dotenv
import os
from domain.check_domain import ClassfiyResult
from langchain_core.runnables import RunnablePassthrough

load_dotenv()


class ClassifyChecker:
    
    def __init__(self):
        self.llm = ChatTongyi(
            model="qwen-turbo",
            temperature=0,
            streaming=False
        )
        self.parser = PydanticOutputParser(pydantic_object=ClassfiyResult)

        # 初始化合规性分析链
        self.compliance_chain = self.create_compliance_chain()
        # LCEL链无需SequentialChain，直接赋值
        self.full_chain = self.compliance_chain

    def check(self):
        for cosmetic in self.cosmetics:
            if not self.check_cosmetic(cosmetic):
                return False
        return True
    def check_cosmetic(self, cosmetic):
        if cosmetic.price < 0:
            return False

        

    def check_product_classify(self, product_name: str) -> ClassfiyResult:
        # 直接调用LCEL链
        result = self.full_chain.invoke({"product_name": product_name})
        # LCEL链已输出ComplianceCheck对象，无需再次parse
        compliance_result = result["compliance_result"]
        return compliance_result

    
    def create_compliance_chain(self) -> Any:
        name_chain = self._create_name_chain_lcel()
        # 如有更多子链，可按需组合
        # 使用RunnablePassthrough.assign实现输入输出字典包装，兼容原LLMChain输出格式
        compliance_chain = RunnablePassthrough.assign(compliance_result=name_chain)
        return compliance_chain

    def _create_name_chain_lcel(self):
        template = """
    
        你是一位商品分类专家，需根据输入的商品名称准确归类到以下六类：化妆品、二级医疗器械、服装鞋帽、数码产品、办公文具、其他。分类需严格遵循中国法律法规及行业标准。

        分析框架
        请对以下商品进行分类：
        商品名称：{product_name}

        分类标准
            化妆品
            定义：以清洁/保养/美容/修饰为目的的日用化学产品（《化妆品监督管理条例》第三条）
            典型品类：洗面奶/口红/防晒霜/香水

            二级医疗器械
            定义：风险程度中等，需严格控制管理的医疗器械（《医疗器械分类目录》第二类）
            典型品类：医用口罩/血压计/血糖仪/避孕套

            服装鞋帽
            定义：用于穿着的纺织品及制品（《产品质量法》定义）
            典型品类：衬衫/运动鞋/羽绒服/帽子

            数码产品
            定义：使用数字技术实现功能的电子设备
            典型品类：手机/数码相机/平板电脑/智能手表

            办公文具
            定义：用于办公场景的书写/记录/整理工具（《消费品使用说明》GB/T 5296.5）
            典型品类：中性笔/文件夹/订书机/计算器

            其他
            定义：不符合前五类定义的商品
            典型案例：家具/玩具/厨具/普通日用品
            判断原则：无特殊功能宣称且不涉及行业专项监管

        示例
        输入：一次性医用外科口罩 → 输出：二级医疗器械
        输入：氨基酸洁面乳 → 输出：化妆品
        输入：防风羽绒服 → 输出：服装鞋帽
        输入：激光打印机 → 输出：数码产品
        输入：按动中性笔 → 输出：办公文具
        输入：陶瓷花瓶 → 输出：其他

        输出要求
        请直接输出分类结果，格式为：
        商品名称 → 分类类别

        {format_instructions}
      """
        prompt = PromptTemplate(
            template=template,
            input_variables=["product_name"],
            partial_variables={"format_instructions": self.parser.get_format_instructions()}
        )
        # LCEL链式表达：prompt | llm | parser
        chain = prompt | self.llm | self.parser
        return chain